﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Collections;
using Persistencia_y_capa_de_negocio;
using System.Net;
using System.IO;

namespace clonegame
{
    public partial class formularioNoticias : UserControl
    {
        private static readonly formularioNoticias instancia = new formularioNoticias();
        private static ArrayList lista_noticias; //Lista con todas las noticias
        private static CADNoticia cadNoticia;    //CADNoticia
        private bool modificado;                 //Guarda el estado del formulario: Si hay modificaciones pendientes de guardar o no
        private int num_noticias;                //Número de noticias

        public static formularioNoticias Instancia
        {
            get { return instancia; }
        }
        /// <summary>
        /// Constructor: Crea una nueva instancia e inicializa los miembros
        /// </summary>
        public formularioNoticias()
        {
            InitializeComponent();
            cadNoticia=new CADNoticia();
            lista_noticias = cadNoticia.getNoticias();
            modificado = false;
            bPublicar.Enabled = false;
            btModificar.Enabled = false;
            bTwitter.Enabled = false;
            bBorrar.Enabled = false;
            Recargar();
        }

        /// <summary>
        /// Actualiza en la BD la noticia actual
        /// </summary>
        private void btModificar_Click(object sender, EventArgs e)
        {
            int index = lbNoticias.SelectedIndex;
            if (index < 0)
                return;
            ENNoticia noticia = (ENNoticia)lista_noticias[index];
            noticia.Titulo = tbTitulo.Text;
            noticia.Cuerpo = rtbCuerpo.Text;
            noticia.Resumen = rtbResumen.Text;
            noticia.Admin = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
            cadNoticia.uploadNoticia(noticia);
            btModificar.Enabled = false;
            modificado = false;
        }

        /// <summary>
        /// Se ejecuta cuando el usuario selecciona otra noticia en el listado
        /// </summary>
        private void lbNoticias_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (modificado && MessageBox.Show("Si cambias de noticia perderás los cambios realizados. ¿Estás seguro de querer continuar?.", "Descartar Cambios", MessageBoxButtons.YesNo)==DialogResult.No)
                return;
            int index=lbNoticias.SelectedIndex;
            if (index < 0)
                return;
            gbNoticia.Enabled = true;
            ENNoticia noticia = (ENNoticia)lista_noticias[index];
            tbTitulo.Text = noticia.Titulo.Trim();
            rtbCuerpo.Text = noticia.Cuerpo.Trim();
            rtbResumen.Text = noticia.Resumen.Trim();
            modificado = false;
            btModificar.Enabled = false;
            bTwitter.Enabled = true;
            bPublicar.Enabled = true;
            bBorrar.Enabled = true;
        }

        /// <summary>
        /// Consulta la BD y carga de nuevo toda la lista de noticias, y redibuja algunos de los componentes del formulario
        /// </summary>
        private void Recargar()
        {
            cadNoticia = new CADNoticia();
            num_noticias = 0;
            lbNoticias.Items.Clear();
            lista_noticias.Clear();
            lista_noticias = cadNoticia.getNoticias();
            lbNoticias.BeginUpdate();
            foreach (ENNoticia noticia in lista_noticias)
            {
                num_noticias++;
                lbNoticias.Items.Add("Noticia " + noticia.ID);
            }
            lbNoticias.EndUpdate();
        }

        /// <summary>
        /// Crea una nueva noticia en blanco
        /// </summary>
        private void bNueva_Click(object sender, EventArgs e)
        {
            if (modificado && MessageBox.Show("Si creas una noticia perderás los cambios realizados. ¿Estás seguro de querer continuar?.", "Descartar Cambios", MessageBoxButtons.YesNo) == DialogResult.No)
                return;
            cadNoticia.insertarNoticia(new ENNoticia("Nueva Noticia", "", "", formularioMaestro.Instancia.UsuarioLogueado.CuentaAd));
            Recargar();
            gbNoticia.Enabled = false;
            tbTitulo.Text = "";
            rtbCuerpo.Text = "";
            rtbResumen.Text = "";
            rpal.Text = "";
            rcar.Text = "";
            ccar.Text = "";
            cpal.Text = "";
            modificado = false;
            bBorrar.Enabled = false;
            bPublicar.Enabled = false;
            btModificar.Enabled = false;
            bTwitter.Enabled = false;
        }

        /// <summary>
        /// Cuenta los caracteres y las palabras del cuerpo de la noticia. Se llama cada vez que hay un cambio.
        /// </summary>
        private void rtbCuerpo_TextChanged(object sender, EventArgs e)
        {
            String texto=rtbCuerpo.Text;
            Regex saltos=new Regex("\\n/g");
            Regex espacios=new Regex("\\s+");
            Regex inicio=new Regex("^\\s");
            Regex final=new Regex("\\s$");
            Regex todo = new Regex("\\s");
            texto = saltos.Replace(texto, " ");
            texto = espacios.Replace(texto, " ");
            texto = inicio.Replace(texto, "");
            texto = final.Replace(texto, "");
            char[] separador=new char[1];
            separador[0]=' ';
            int palabras = texto.Split(separador).Length;
            texto = todo.Replace(texto, "");
            int caracteres = texto.Length;
            cpal.Text = palabras.ToString();
            ccar.Text = caracteres.ToString();
            modificado = true;
            btModificar.Enabled = true;
        }

        /// <summary>
        /// Cuenta los caracteres y las palabras del resumen de la noticia. Se llama cada vez que hay un cambio.
        /// </summary>
        private void rtbResumen_TextChanged(object sender, EventArgs e)
        {
            String texto = rtbResumen.Text;
            Regex saltos = new Regex("\\n/g");
            Regex espacios = new Regex("\\s+");
            Regex inicio = new Regex("^\\s");
            Regex final = new Regex("\\s$");
            Regex todo = new Regex("\\s");
            texto = saltos.Replace(texto, " ");
            texto = espacios.Replace(texto, " ");
            texto = inicio.Replace(texto, "");
            texto = final.Replace(texto, "");
            char[] separador = new char[1];
            separador[0] = ' ';
            int palabras = texto.Split(separador).Length;
            texto = todo.Replace(texto, "");
            int caracteres = texto.Length;
            rpal.Text = palabras.ToString();
            rcar.Text = caracteres.ToString();
            modificado = true;
            btModificar.Enabled = true;
        }

        /// <summary>
        /// Borra la noticia seleccionada de la BD
        /// </summary>
        private void bBorrar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Estás seguro de querer borrar la noticia seleccionada?.", "Confirmación para borrar", MessageBoxButtons.YesNo) == DialogResult.No)
                return;
            int index = lbNoticias.SelectedIndex;
            if (index < 0)
                return;
            gbNoticia.Enabled = false;
            tbTitulo.Text = "";
            rtbCuerpo.Text = "";
            rtbResumen.Text = "";
            rpal.Text = "";
            rcar.Text = "";
            ccar.Text = "";
            cpal.Text = "";
            modificado = false;
            lbNoticias.Items.Remove(lbNoticias.SelectedItem);
            cadNoticia.borrarNoticia((ENNoticia)lista_noticias[index]);
            lista_noticias.Remove(lista_noticias[index]);
            num_noticias--;
            if (num_noticias <= 0)
                bBorrar.Enabled = false;
            btModificar.Enabled = false;
            bPublicar.Enabled = false;
            bTwitter.Enabled = false;
            bBorrar.Enabled = false;
        }

        /// <summary>
        /// Manda a TWITTER el resumen actual de la noticia (NO el guardado).
        /// </summary>
        private void bTwitter_Click(object sender, EventArgs e)
        {
            PostTweet("clonegame", "123clonegame", rtbResumen.Text);
        }

        /// <summary>
        /// Manda a una cuenta de TWITTER un nuevo TWEET
        /// </summary>
        public static void PostTweet(string username, string password, string tweet)
        {
            try
            {
                string user = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password));
                byte[] bytes = System.Text.Encoding.ASCII.GetBytes("status=" + tweet);
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://twitter.com/statuses/update.xml");
                request.Method = "POST";
                request.ServicePoint.Expect100Continue = false;
                request.Headers.Add("Authorization", "Basic " + user);
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = bytes.Length;
                Stream reqStream = request.GetRequestStream();
                reqStream.Write(bytes, 0, bytes.Length);
                reqStream.Close();
                MessageBox.Show("Se ha mandado el resumen a TWITTER correctamente.","Tweet Publicado");
            }
            catch (Exception)
            {
                MessageBox.Show("Se ha producido un error al mandar el resumen a TWITTER.", "Error Twitter");
            }
        }

        /// <summary>
        /// Activa el estado de cambio sin guardar cuando se modifica el título
        /// </summary>
        private void tbTitulo_TextChanged(object sender, EventArgs e)
        {
            modificado = true;
            btModificar.Enabled = true;
        }

        /// <summary>
        /// Publica la noticia seleccionada
        /// </summary>
        private void bPublicar_Click(object sender, EventArgs e)
        {
            if (modificado && MessageBox.Show("Los cambios de la noticia actual no se han guardado. Si publicas ahora la noticia se publicará con los datos guardados. ¿Quieres continuar?.", "Publicar Antigua", MessageBoxButtons.YesNo) == DialogResult.No)
                return;
            int index = lbNoticias.SelectedIndex;
            if (index < 0)
                return;
            ENNoticia noticia = (ENNoticia)lista_noticias[index];
            noticia.Publicada = true;
            cadNoticia.uploadNoticia(noticia);
            MessageBox.Show("Noticia Publicada Correctamente", "Noticia Publicada");
        }

        /// <summary>
        /// Borra la noticia actual al pulsar SUP
        /// </summary>
        private void lbNoticias_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 46)
            {
                EventArgs ea = null;
                bBorrar_Click(sender, ea);
            }
        }

        /// <summary>
        /// Borra la noticia actual al pulsar SUP
        /// </summary>
        private void formularioNoticias_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 46)
            {
                EventArgs ea = null;
                bBorrar_Click(sender, ea);
            }
        }
    }
}
